package com.wei.czz.framework.index.controller;

import com.wei.czz.common.dto.blog.BlogDto;
import com.wei.czz.common.dto.blog.TagSortDto;
import com.wei.czz.common.enums.ResultEnum;
import com.wei.czz.common.jsr303.group.Search;
import com.wei.czz.common.tool.PageDto;
import com.wei.czz.common.tool.Result;
import com.wei.czz.common.vo.blog.TagSortVo;
import com.wei.czz.framework.index.service.TagSortService;
import lombok.AllArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;

/**
 * Created by IntelliJ IDEA.
 *
 * @author wei
 * date: 2021-05-26 13:51:00
 * className: TagSortController 浏览器页面-标签排行页面-接口类
 * version: 1.0
 * description:
 */
@RestController
@RequestMapping("index/tag")
@AllArgsConstructor
public class TagSortController {

    private static final Logger log = LoggerFactory.getLogger(TagSortController.class);

    private final TagSortService tagSortService;

    /**
     * 标签排序页面数据查询接口
     * 1、查询系统已发布博客关联的所有博客标签列表，按引用次数降序排序
     * 2、分页检索标签关联的系统已发布博客列表
     *
     * 调用方：
     *  1、浏览器-标签排序页面调用
     * @param tagSortVo 标签排序检索Vo对象
     */
    @PostMapping("/sort/data")
    public Result<Map<String, Object>> getTagPageData(@Validated(Search.class) @RequestBody TagSortVo tagSortVo) {
        log.info("开始查询标签排序页面初始化数据业务。{}", tagSortVo);

        List<TagSortDto> tagSortList = null;
        PageDto<BlogDto> blogPage = new PageDto<>();

        if (StringUtils.isBlank(tagSortVo.getTagName())) {
            // 查询系统已发布博客关联的标签列表（按照引用次数降序排序）
            tagSortList = tagSortService.getTagList(tagSortVo);

            if (!tagSortList.isEmpty()) {
                TagSortDto tagSortDto = tagSortList.get(0);
                tagSortVo.setTagName(tagSortDto.getTagName());
                // 分页查询标签关联的博客列表
                blogPage = tagSortService.getBlogList(tagSortVo);
            }
        } else {

            if (StringUtils.isBlank(tagSortVo.getSearchTag())) {
                // 分页查询标签关联的博客列表
                blogPage = tagSortService.getBlogList(tagSortVo);
            } else {
                // 异步分页查询标签关联的博客列表
                Future<PageDto<BlogDto>> future = tagSortService.getBlogListOnAsync(tagSortVo);

                // 查询系统已发布博客关联的标签列表（按照引用次数降序排序）
                tagSortList = tagSortService.getTagList(tagSortVo);

                try {
                    blogPage = future.get();
                } catch (InterruptedException | ExecutionException e) {
                    log.error("异步分页查询标签关联的博客列表失败，请务必及时处理");
                    return Result.getResult(ResultEnum.REQUEST_FAIL.getCode(), "获取标签关联的博客列表失败，请联系管理员处理。");
                }
            }
        }

        log.info("查询标签排序页面初始化数据业务结束");
        Map<String, Object> data = new HashMap<>();
        data.put("tagSortList", tagSortList);
        data.put("blogPage", blogPage);
        return Result.success(data);
    }

}
